#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int BASE=1e6;
const int N=8e7+10;
int flg[N][3];


struct node{
	int a[2];
	int b[2];
	int c[2];
	bool operator < (const node& p) const
	{
		if(b[0]==p.b[0])
		{
			return a[0]<p.a[0];
		}
		return b[0]<p.b[0];
	}
	bool operator == (const node& p) const 
	{
		if(a[0]!=p.a[0])
			return false;
		if(a[1]!=p.a[1])
			return false;
		if(b[0]!=p.b[0])
			return false;
		if(b[1]!=p.b[1])
			return false;
		if(c[0]!=p.c[0])
			return false;
		if(c[1]!=p.c[1])
			return false;
		return true;	
	}
	
};


int main()
{
    int n;
    cin>>n;
    vector<pair<int,int>> v;
    int zero=0;
    int one=0;
    while(n--)
    {
    	int x,y;
    	cin>>x>>y;
    	x+=BASE;
    	flg[x][y]=1;
    	v.push_back({y,x});
    	if(y==0)
    	{
			zero++;
		}else if(y==1)
		{
			one++;
		}
    }
    sort(v.begin(),v.end());
    vector<node> ret;
    for(int i=0;i<zero;i++)
    {
		for(int j=zero;j<=zero+one && j<v.size();j++)
		{
			if(v[i].first!=0 || v[j].first!=1)
				continue;
			int dif=v[i].second-v[j].second;
			int t=v[j].second-dif;
			if(flg[t][2])
			{
				node tmp;
				tmp.a[0]=v[i].second-BASE;
				tmp.a[1]=v[i].first;
				tmp.b[0]=v[j].second-BASE;
				tmp.b[1]=v[j].first;
				tmp.c[0]=t-BASE;
				tmp.c[1]=2;
				
				ret.push_back(tmp);
			}
			
		}
	}
	if(ret.empty())
	{
		cout<<-1<<endl;
	}
	else{
		sort(ret.begin(),ret.end());
		for(int i=0;i<ret.size();i++)
		{
			node kk=ret[i];
			if(i>0)
			{
				if(kk==ret[i-1])
					continue;	
			}
			printf("[%d, %d] [%d, %d] [%d, %d]\n",kk.a[0],kk.a[1],kk.b[0],kk.b[1],kk.c[0],kk.c[1]);

		}
	}
    return 0;
}
